#  所有页面对象都要继承的一个页面操作类
#  如何定位标签，返回标签文本，点击，手势操作（长按，滑动）等
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
from selenium import webdriver


class Base:

    def __init__(self, driver):
        self.driver = driver
        #  当需要使用App的网页时， 需要给参数（appium）
        # self.driver = self.driver.Remote('http://127.0.0.1:4723/wd/hub', conf)
        #  当为普通web网页时
        self.driver.get('https://www.126.com/')
        self.driver.implicitly_wait(15)

    def find_element(self, value):
        """
        定位元素的方法
        :param value: 包含定位方式和值的一个元组
        :return: 返回一个元素
        """
        WebDriverWait(self.driver, 10).until(ec.presence_of_element_located(value))
        return self.driver.find_element(*value)

    def find(self, value):
        """
        定位元素的方法
        :param value: 包含定位方式和值的一个元组
        :return: 返回一个元素
        """
        try:
            self.driver.find_element(*value)
        except Exception as e:
            print(e, "定位方式不存在", value)
            return False
        return True

    def find_elements(self, value):
        """
        返回多个元素的方法
        :param value: 包含定位方式和值的一个元组
        :return: 返回一组元素
        """
        WebDriverWait(self.driver, 10).until(ec.presence_of_element_located(value))
        return self.driver.find_elements(*value)

    def click(self, value):
        """
        点击的方法
        :param value: 包含定位方式和值的一个元组
        :return: 不返回东西
        """
        if self.find(value):
            self.find_element(value).click()

    def send_keys(self, xxx, value):
        """
        输入文本的方法
        :param xxx: 包含定位方式和值的一个元组
        :param value: 输入的文本
        :return: 不返回东西
        """
        if self.find(value):
            self.find_element(xxx).send_keys(value)

    def get_text(self, value):
        """
        返回元素的文本
        :param value: 定位元素的元组
        :return: 返回文本值
        """
        if self.find(value):
            return self.find_element(value).text

    def get_attribute(self, value, attr_name):
        """
        获取指定页面元素的特定属性
        :param value: 定位元素的元组
        :param attr_name: 需要获取的属性名
        :return: 文本
        """
        if self.find(value):
            return self.find_element(value).get_attribute(attr_name)

    def huadong_zong(self, dr, ta, juli=0.2):
        """
        纵轴滑动的方法
        :param dr: 浏览器对象
        :param ta: 手势驱动对象
        :param juli: 滑动的距离（正负0.5）正数向下话
        :return: 不返回
        """
        # 获取当前设备的大小
        re = dr.get_window_rect()
        # 计算开始位置和结束位置
        x_start = re['width'] * 0.5
        y_start = re["height"] * 0.5
        y_end = re["height"] * (0.5 - juli)
        ta.press(x=x_start, y=y_start).wait(1000).move_to(x=x_start, y=y_end).release().perform()

    def huadong_heng(self, dr, ta, juli=0.2):
        """
        横轴滑动的方法
        :param dr: 浏览器对象
        :param ta: 手势驱动对象
        :param juli: 滑动的距离（正负0.5）正数向下话
        :return: 不返回
        """
        # 获取当前设备的大小
        re = dr.get_window_rect()
        # 计算开始位置和结束位置
        x_start = re['width'] * 0.5
        x_end = re['width'] * (0.5 - juli)
        y_start = re["height"] * 0.5
        ta.press(x=x_start, y=y_start).wait(1000).move_to(x=x_end, y=y_start).release().perform()

    def frame(self, value):
        """
        切换到内嵌页的方法
        :param value:要切换到的内嵌页的定位方式和值
        :return:不返回东西，切入到内嵌页中
        """
        a = self.find_element(value)
        self.driver.switch_to.frame(a)

    def parent_frame(self):
        """
        切换到父框中
        :return: 不返回任何值
        """
        self.driver.switch_to.parent_frame()

    def switch(self, value):
        """
        切换窗口的功能
        :param value:切换到第几个窗口
        :return:不返回东西，切换到对应的窗口
        """
        a = int(value)+1
        self.driver.switch_to.window(self.driver.window_handles[a])

    def switch_modal_accept(self):
        """
        切入模态框并确定
        :return:
        """
        self.driver.switch_to.alert.accept()

    def switch_model_send(self, value):
        """
        给模态框输入一个值的方法
        :param value:输入的值
        :return:不返回东西
        """
        self.driver.switch_to.alert.send_keys(value)
